home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 October: Mac OS SDK / Dev.CD Oct 97 SDK1.toast / Development Kits (Disc 1) / AppleScript / Development Tools / Sample Code / 7Edit 3.1 / Sources / SVAEPaste.c < prev    next >
Encoding:
Text File  |  1995-11-20  |  2.8 KB  |  130 lines  |  [TEXT/CWIE]

  1. // SVAEPaste.c
  2. //
  3. // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
  4. // 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1995, all rights reserved.
  6.  
  7. #include "SVAEPaste.h"
  8.  
  9. #include "SVEditAEUtils.h"
  10. #include "SVEditWindow.h"        // for DPtrFromWindowPtr()
  11.  
  12. #include "SVAESelect.h"
  13.  
  14.  
  15. #pragma segment AppleEvent
  16.  
  17. // Handle a paste from scrap e.g 'paste last word of document 1' would change the
  18. // last word in the front window to what's in the scrap.
  19. // If no reference is given then the selection of the front window
  20. // is used.
  21.      
  22. pascal OSErr    DoPaste(const AppleEvent *theAppleEvent, AppleEvent *reply, long refcon)
  23. {
  24. #pragma unused (reply, refcon)
  25.  
  26.     AEDesc        directObj = {typeNull, NULL};
  27.     TextToken    aTextToken;
  28.     short        ignore;
  29.     OSErr        err;
  30.  
  31.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  32.     // If we get an error here it just means that they haven't supplied a reference to
  33.     // an object to paste to - so paste to the current section instead.
  34.     
  35.     if (directObj.descriptorType != typeNull)
  36.         err = PasteDesc(&directObj);
  37.     else
  38.     {            // Just paste to the selection of the front window
  39.         err = GetWindowSelection(FrontWindow(), &aTextToken, &ignore);
  40.         if (noErr != err) goto done;
  41.         
  42.         err = PasteTextToken(&aTextToken);
  43.     }
  44.  
  45. done:    
  46.     if (directObj.dataHandle)
  47.         AEDisposeDesc(&directObj);
  48.         
  49.     return(err);
  50. }
  51.  
  52.  
  53. OSErr    PasteTextToken(TextToken* theToken)
  54. {
  55.     WindowPtr        aWindow;
  56.     DPtr            docPtr;
  57.     OSErr            err;
  58.     
  59.     aWindow = theToken->tokenWindow;
  60.     docPtr = DPtrFromWindowPtr(theToken->tokenWindow);
  61.     
  62.     if (! aWindow || ! docPtr)
  63.         return(errAENoSuchObject);
  64.  
  65.                     // Set this tokens selection
  66.     err = SelectTextToken(theToken);
  67.     if (noErr != err) goto done;
  68.  
  69.     TEStylPaste(docPtr->theText);     
  70.             
  71.     docPtr->dirty = true;
  72.     AdjustScrollbars(docPtr, false);
  73.     DrawPageExtras(docPtr);
  74.             
  75. done:
  76.     return(err);
  77. }
  78.  
  79. OSErr    PasteTextDesc(AEDesc* textDesc)
  80. {
  81.     TextToken        aTextToken;
  82.     Size            actualSize;
  83.     OSErr            err;
  84.  
  85.     if (typeMyText != textDesc->descriptorType)
  86.         return(errAETypeError);
  87.         
  88.     GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  89.  
  90.     err = PasteTextToken(&aTextToken);
  91.     
  92.     return(err);
  93. }
  94.  
  95.  
  96. OSErr    PasteDesc(AEDesc* aDesc)
  97. {
  98.     AEDesc        pasteDesc = {typeNull, NULL},
  99.                 textDesc = {typeNull, NULL};
  100.     OSErr        err;
  101.     
  102.     if (typeObjectSpecifier == aDesc->descriptorType)
  103.         err = AEResolve(aDesc, kAEIDoMinimum, &pasteDesc);
  104.     else
  105.         err = AEDuplicateDesc(aDesc, &pasteDesc);
  106.         
  107.     if (noErr != err) goto done;
  108.     
  109.     switch (pasteDesc.descriptorType)
  110.     {
  111.         case typeAEList:
  112.             err = errAETypeError;
  113.             // We can't handle pasting more than one item from the scrap
  114.             break;
  115.             
  116.         default:
  117.             err = AECoerceDesc(&pasteDesc, typeMyText, &textDesc);
  118.             if (noErr != err) goto done;
  119.             err = PasteTextDesc(&textDesc);
  120.     }
  121.     
  122. done:
  123.     if (pasteDesc.dataHandle)
  124.         AEDisposeDesc(&pasteDesc);
  125.     if (textDesc.dataHandle)
  126.         AEDisposeDesc(&textDesc);
  127.     
  128.     return(err);
  129. }
  130.